#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
人脸识别功能示例程序
"""

import sys
import os
import warnings

import numpy as np

warnings.filterwarnings("ignore", category=UserWarning, module="face_recognition_models")

# 添加项目根目录到Python路径
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from src.algorithms import FaceRecognition
from src.utils import create_faces_directory
import cv2


def main():
    # 创建人脸识别实例
    face_recognizer = FaceRecognition()

    # 创建faces目录（如果不存在）
    faces_dir = create_faces_directory()
    print(f"人脸图像目录: {faces_dir}")

    # 加载已知人脸
    print("正在加载已知人脸...")
    if not face_recognizer.load_known_faces(faces_dir):
        print("提示: 将人脸图像放入faces目录以进行识别")
        print("图像文件名将被用作人名（例如: zhangsan.jpg -> zhangsan）")

    # 提供选项菜单
    while True:
        print("\n" + "=" * 50)
        print("人脸识别系统")
        print("=" * 50)
        print("1. 从摄像头识别人脸 (按 'q' 键退出)")
        print("2. 从图片识别人脸")
        print("3. 添加新人脸")
        print("4. 退出")

        choice = input("\n请选择操作 (1-4): ").strip()

        if choice == '1':
            print("启动摄像头人脸识别...")
            face_recognizer.recognize_from_video()

        elif choice == '2':
            image_path = input("请输入图片路径: ").strip()
            # 移除路径两端可能存在的引号
            image_path = image_path.strip('"')
            if os.path.exists(image_path):
                try:
                    print("正在识别图片中的人脸...")
                    locations, names = face_recognizer.recognize_from_image(image_path)

                    print(f"检测到 {len(names)} 张人脸:")
                    for i, name in enumerate(names):
                        print(f"  {i + 1}. {name}")

                except Exception as e:
                    print(f"识别过程中出错: {e}")
            else:
                print("图片文件不存在!")

        elif choice == '3':
            # 请输入人脸图片路径: "F:\\sanduo\\张露2.jpg"
            # 请输入人名: "张露"
            image_path = input("请输入人脸图片路径: ").strip()
            # 移除路径两端可能存在的引号
            image_path = image_path.strip('"')
            name = input("请输入人名: ").strip()
            if os.path.exists(image_path) and name:
                if face_recognizer.add_face(image_path, name):
                    # 将图片复制到faces目录作为参考
                    try:
                        filename = f"{name}.jpg"
                        target_path = os.path.join(faces_dir, filename)
                        # 使用numpy处理中文路径问题
                        with open(image_path, 'rb') as f:
                            file_bytes = np.asarray(bytearray(f.read()), dtype=np.uint8)
                            image = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
                        if image is not None:
                            # 处理中文文件名保存问题：使用了cv2.imwrite，这可能会导致中文文件名保存问题
                            """
                            cv2.imwrite 确实可能会导致中文文件名保存问题。这主要是因为：
                                1. OpenCV的编码兼容性：OpenCV在处理文件路径时可能不完全支持UTF-8编码，特别是在Windows系统上。
                                2. 文件系统限制：虽然现代Windows系统支持UTF-8编码，但某些旧版本或特定配置下可能存在兼容性问题。
                                3. 库内部实现：cv2.imwrite 函数内部可能使用了不完全兼容UTF-8的文件操作方式。
                            推荐方案
                                我推荐使用Python内置的文件操作，因为它：
                                    完全控制文件操作过程
                                    避免了OpenCV的编码问题
                                    兼容性最好
                                    性能良好
                            """
                            # 将图像数据转换为字节流
                            # 将图像编码为JPEG格式并保存
                            is_success, im_buf_arr = cv2.imencode(".jpg", image)
                            if is_success:
                                # 使用tofile方法保存图像，避免cv2.imwrite的中文路径问题
                                im_buf_arr.tofile(target_path)
                                print(f"已在 {target_path} 保存副本")
                            else:
                                print("图像编码失败")
                        else:
                            print("无法读取图像文件")
                    except Exception as e:
                        print(f"保存副本时出错: {e}")
            else:
                print("图片文件不存在或人名为空!")

        elif choice == '4':
            print("退出程序")
            break

        else:
            print("无效选择，请重新输入!")


if __name__ == "__main__":
    main()
